package com.mh.community.service.impl;

import com.mh.common.utils.OrikaUtils;
import com.mh.community.domain.HjyCommunity;
import com.mh.community.domain.dto.HjyCommunityDTO;
import com.mh.community.domain.vo.HjyCommunityVO;
import com.mh.community.mapper.HjyCommunityMapper;
import com.mh.community.service.HjyCommunityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class HjyCommunityServiceImpl implements HjyCommunityService {

    @Autowired
    private HjyCommunityMapper cm;

    private static final String CODE_PREFIX = "COMMUNITY_";

    @Override
    public List<HjyCommunityDTO> selectList(HjyCommunity hjyCommunity) {
        return cm.selectList(hjyCommunity);
    }

    @Override
    public int insertCom(HjyCommunity comm) {
        //community_code字段的固定格式 : COMMUNITY_1675945745985(前缀+时间戳)
        //根据接口文档前端不传入此字段的值,前端传入的是"communityCode": null
        //因此插入到数据库前,按照固定格式设值
        comm.setCommunityCode(CODE_PREFIX+ System.currentTimeMillis());
        return cm.insert(comm); //返回插入数据影响行数
    }

    @Override
    public HjyCommunity selectComById(Long id) {
        /** MyBatis-Plus 中 BaseMapper 接口提供的一个方法
         *  根据主键（ID）查询单条记录
         *  selectById() 方法默认将传入的参数视为主键
         *  它会根据实体类中定义的主键字段（通常是 id生成SQL 语句,并将传入的参数值作为主键的值进行查询
         */
        return cm.selectById(id);
    }

    @Override
    public int updateCom(HjyCommunity hjyCommunity) {
        /** MyBatis-Plus 中 BaseMapper 接口提供的一个方法
         *  根据主键(ID)修改
         *  形参: 实体类对象
         */
        return cm.updateById(hjyCommunity);
    }

    @Override
    public int deleteComById(Long[] ids) {
        /** 实现单条 or 多条删除
         *  deleteBatchIds形参:Collection接口
         *  但此方法传入的是数组,因此通过工具类将数组转换为List(子接口)
         */
        return cm.deleteBatchIds(Arrays.asList(ids));
    }

    @Override
    public List<HjyCommunityVO> selectPullDown(HjyCommunity comm) {

        //通过Service层已有的方法获取所有小区相关信息(原对象)
        List<HjyCommunityDTO> commDTOs = cm.selectList(comm);

        //通过对象拷贝工具-->对象拷贝
        List<HjyCommunityVO> vos = commDTOs.stream().map(dto -> {
            /** 通过OrikaUtils拷贝对象
             *  OrikaUtils为自定义工具类,convert()方法可拷贝对象
             *  参数: 原来的对象,需要拷贝到的目标对象.class
             *  原对象: 属性10个 --> 目标对象: 属性2个
             */
            HjyCommunityVO vo = OrikaUtils.convert(dto, HjyCommunityVO.class);
            return vo;
        }).collect(Collectors.toList());

        return vos;
    }
}
